using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace SuperPolarity { class Ship : Actor { public enum Polarity : byte { Negative, Positive, Neutral }; public Polarity CurrentPolarity; public uint MagneticRadius; public float FleeVelocity; public float ActVelocity; public float ChargeVelocity; protected int RepelRadius; protected bool Magnetizing; public Ship(SuperPolarity newGame) : base(newGame) { MagneticRadius = 250; RepelRadius = 100; HP = 2; FleeVelocity = 5; ActVelocity = 1; ChargeVelocity = 2.5f; CurrentPolarity = Polarity.Neutral; Magnetizing = false; } public virtual void SwitchPolarity() { if (CurrentPolarity == Polarity.Positive) { CurrentPolarity = Polarity.Negative; } else { CurrentPolarity = Polarity.Positive; } } public virtual void SetPolarity(Polarity newPolarity) { CurrentPolarity = newPolarity; } public virtual void Shoot() { } public override void Update(GameTime gameTime) { base.Update(gameTime); Magnetizing = false; } public virtual void Magnetize(Ship ship, float distance, float angle) { Magnetizing = true; Polarity polarity = ship.CurrentPolarity; if (polarity != CurrentPolarity) { Attract(angle); } else { Repel(distance, angle); } } protected void Attract(float angle) { Velocity.X = (float) (ChargeVelocity * Math.Cos(angle)); Velocity.Y = (float) (ChargeVelocity * Math.Sin(angle)); } protected void Repel(float distance, float angle) { if (distance > RepelRadius) { Magnetizing = false; return; } Velocity.X = -(float)(FleeVelocity * Math.Cos(angle)); Velocity.Y = -(float)(FleeVelocity * Math.Sin(angle)); } } }